// const set = new Set(['foo', 'bar', 'baz'])

// // 调用 set 对象的 iterator 方法，得到对象的迭代器
// const iterator = set[Symbol.iterator]()

// // 通过迭代器的 next 方法，得到每次迭代的结果
// console.log(iterator.next()) // { value: 'foo', done: false }
// console.log(iterator.next()) // { value: 'bar', done: false }
// console.log(iterator.next()) // { value: 'baz', done: false }
// console.log(iterator.next()) // { value: undefined, done: false }


/**
 * 实现iterator
 * obj 自定义对象，实现了可迭代接口，iterable，约定内部必须有一个用于返回迭代器的iterator方法
 * obj 中返回的对象，实现了迭代器接口，iterator，约定内部必须有一个用于迭代的 next 方法
 * next 中返回的对象，实现了迭代结果接口，iterationResult，约定内部必须有一个value属性，用来表示当前被迭代到的数据，可为任意类型的数据，done布尔值，表示迭代有没有结束
 */
// // iterable
// const obj = {
//   [Symbol.iterator]: function () {
//     // iterator
//     return {
//       next: function () {
//         // iterationResult
//         return {
//           value: 'zhangsan',
//           done: true
//         }
//       }
//     }
//   }
// }
// for (const i of obj) {
//   // 由于上面写死了 done 属性的值，因此第一次调用时，循环就已经结束
//   console.log('循环啊')
// }

// // 优化
// const obj1 = {
//   store: ['foo', 'bar', 'baz'], // 存放值得被遍历的数据
//   [Symbol.iterator]: function () {
//     // 在 next 方法中迭代上面的数组，因此需要维护一个下标，默认为0
//     let index = 0
//     // 由于 next 方法中的this不是obj对象，因此定义一个 self 变量，用来接受 this
//     const self = this
//     return {
//       next: function () {
//         const result = {
//           value: self.store[index],
//           done: index >= self.store.length
//         }
//         index++
//         return result
//       }
//     }
//   }
// }
// for (const item of obj1) {
//   console.log(item) // foo；bar；baz
// }

const todos = {
  life: ['1', '2', '3'],
  learn: ['4', '5', '6'],
  
  // 方便外部调用，可写个each方法，把内部数据抛出去
  each: function (callback) {
    const all = [].concat(this.list, this.learn)
    for (const item of all) {
      callback(item)
    }
  },
  
  // 迭代器模式。语言层面实现的迭代器模式
  [Symbol.iterator]: function () {
    const all = [...this.life, ...this.learn]
    let index = 0
    return {
      next: function () {
        return {
          value: all[index],
          done: index++ >= all.length
        }
      }
    }
  }
}

// 调用
todos.each(function (item) {
 console.log(item)
})

console.log('------------------------')
for (const item of todos) {
  console.log(item)
}

